/**
 * Classa com metodos para manipulação de arquivos e pastas
 * Faz criação, deleção, e edição.
 * @author Fagner Fjas
 *
 */

package cruds;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.FileReader;
import java.io.BufferedReader;
import java.util.ArrayList;

import Itens_listas.*;

public class Manipula_txt {
	private File url_arquivo;
	private File txt_arquivo;
	private Musica musica;
	

	/**
	 * Construtor Manipula_txt
	 * 
	 * @param diretorio
	 *            String
	 * @param arquivo
	 *            String
	 */
	public Manipula_txt(String diretorio, String arquivo) {
		url_arquivo = new File(System.getProperty("user.dir") + "/" + diretorio);
		txt_arquivo = new File(url_arquivo.getAbsolutePath() + "/" + arquivo);

	}

	/**
	 * Verifica se diretório existe, caso contrário cria o diretório.
	 * 
	 * @return Boolean
	 */
	public boolean diretorio() {
		if (url_arquivo.exists() == true) {
			return true;
		} else {
			try {
				return url_arquivo.mkdir();
			} catch (Exception e) {
				System.out.println(e);
				return false;
			}
		}
	}

	/**
	 * Verifica se o arquivo existe, caso contrário, cria o arquivo.
	 * 
	 * @return Boolean
	 */
	public boolean arquivo() {
		if (txt_arquivo.exists() == true) {
			return true;
		} else {
			try {
				return txt_arquivo.createNewFile();

			} catch (Exception e) {
				System.out.println(e);
				return false;
			}
		}
	}

	/**
	 * Grava uma linha no arquivo texto, sem apagar o conteúdo anterior do
	 * arquivo.
	 * 
	 * @param dados
	 *            String Informação a ser gravada na próxima linha do arquivo.
	 */
	public void grava(String dados) {
		String arq = txt_arquivo.getAbsolutePath();
		try {

			FileWriter abre_arquivo = new FileWriter(arq, true);
			PrintWriter escr_arquivo = new PrintWriter(abre_arquivo);

			escr_arquivo.println(dados);

			escr_arquivo.flush();
			escr_arquivo.close();

		} catch (IOException e) {
			// TODO: handle exception
			System.out.println(e);
		}
	}

	/**
	 * Limpa o arquiv para atualização da lista;
	 */
	public void limpa_arquivo() {
		String arq = txt_arquivo.getAbsolutePath();
		try {

			FileWriter abre_arquivo = new FileWriter(arq, false);
			PrintWriter escr_arquivo = new PrintWriter(abre_arquivo);

			escr_arquivo.println("");

			escr_arquivo.flush();
			escr_arquivo.close();

		} catch (IOException e) {
			// TODO: handle exception
			System.out.println(e);
		}
	}

	/**
	 * 
	 * @return ArrayList de String com, cada string é uma linha do arquivo txt
	 */
	public ArrayList<String> getLinhas() {
		ArrayList<String> linhas_arquivo = new ArrayList<String>();
		try {
			FileReader le_arquivo = new FileReader(getArquivo());
			BufferedReader buff_arquivo = new BufferedReader(le_arquivo);

			String linha;

			while ((linha = buff_arquivo.readLine()) != null) {
				linhas_arquivo.add(linha);
			}

			le_arquivo.close();

		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e);
		}

		return linhas_arquivo;
	}

	/**
	 * Semelhante ao getLinhas() mas este retorna um ArrayList de listas de
	 * String String[]. Pega o conteúdo de cada linha do arquivo e separa cada
	 * String usando como referência ":"
	 * 
	 * @return ArrayList< String[] >
	 */
	public ArrayList<String[]> getArrayLinhas() {
		ArrayList<String[]> linhas_arquivo = new ArrayList<String[]>();
		try {
			FileReader le_arquivo = new FileReader(getArquivo());
			BufferedReader buff_arquivo = new BufferedReader(le_arquivo);

			String linha;

			while ((linha = buff_arquivo.readLine()) != null) {
				
				String[] dados = linha.split(":"); 
				
				if( dados.length >= 5 ){
					linhas_arquivo.add(dados);
				}
			}

			le_arquivo.close();

		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e);
		}

		return linhas_arquivo;
	}

	/**
	 * Retorna a url da pasta
	 * 
	 * @return File com a url da pasta
	 */
	public String getUrl_arquivo() {
		return url_arquivo.getAbsolutePath();
	}

	/**
	 * Nome do arquivo
	 * 
	 * @return String
	 */
	public String getTxt_arquivo() {
		return txt_arquivo.getName();
	}

	/**
	 * Retorna o objeto file
	 * 
	 * {@deletar arquivo} Para deletar um arquivo usar:
	 * Manipula_txt.getArquivo.delete();
	 * 
	 * @return File - retorna o OBJ do arquivo criado
	 */
	public File getArquivo() {
		return txt_arquivo;
	}

	/**
	 * Renomeia o arquivo que está sendo manipulado atualmente. e modifica o
	 * objeto atual para encaixar o novo nome.
	 * 
	 * @param novo_nome
	 *            String
	 */
	public void Renomeia_txt_arquivo(String novo_nome) {
		File novo_txt_arquivo = new File(url_arquivo.getAbsolutePath() + "/"
				+ novo_nome);
		try {
			txt_arquivo.renameTo(novo_txt_arquivo);
			txt_arquivo = novo_txt_arquivo;
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e);
		}
	}

	/**
	 * Metodo ToString
	 */

	@Override
	public String toString() {
		return "Manipula_txt [url_arquivo=" + url_arquivo + ", txt_arquivo="
				+ txt_arquivo + ", musica=" + musica + "]";
	}
}